import cv2 as cv
import numpy as np
filename1 = r'D:\photo\box.png'
filename2 = r'D:\photo\box_in_scene.png'
img1 = cv.imread(filename1)
img2 = cv.imread(filename2)
orb = cv.ORB_create()
kp1 = orb.detect(img1,None)
kp2 = orb.detect(img2,None)
kp1,des1 = orb.compute(img1,kp1)
kp2,des2 = orb.compute(img2,kp2)
'''对于 BF 匹配器，我们首先要使用 cv2.BFMatcher() 创建一个 BFMatcher 对象。它有两个可选参数。第一个是 normType。它是用来指定要
使用的距离测试类型。默认值为 cv2.Norm_L2。这很适合 SIFT 和 SURF 等 （c2.NORM_L1 也可以）。对于使用二进制描述符的 ORB，BRIEF，BRISK
算法等，要使用 cv2.NORM_HAMMING，这样就会返回两个测试对象之
间的汉明距离。如果 ORB 算法的参数设置为 V T A_K==3 或 4，normType
就应该设置成 cv2.NORM_HAMMING2。'''
bf = cv.BFMatcher(cv.NORM_HAMMING,crossCheck=True)
'''描述子匹配'''
'''matches = bf.match(des1, des2) 返回值是一个 DMatch 对象列表'''
matches = bf.match(des1,des2)
'''sorted() 函数对所有可迭代的对象进行排序操作。sort 是应用在 list 上的方法，sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作，而内建函数 sorted 方法返回的是一个新的 list，而不是在原来的基础上进行的操作。
'''
'''迭代对象；key主要是用来进行比较的元素，只有一个参数，具体的函数的参数就是取自于可迭代对象中，指定可迭代对象中的一个元素来进行
排序'''
matches = sorted(matches,key = lambda i:i.distance)
'''索引20个关键点'''
img_matches1= cv.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=2)
cv.imshow('img_matches',img_matches1)
cv.waitKey()
